home *** CD-ROM | disk | FTP | other *** search
/ Quick PC 61 / Quick PC 61.iso / I386 / SQLRUN.CAB / ansiview.sql.24170C3F_A9E4_47C1_8DFE_FD79C2714697 next >
Encoding:
Text File  |  2000-07-04  |  33.1 KB  |  1,045 lines

  1. /*
  2. ** Copyright Microsoft, Inc. 1994 - 2000
  3. ** All Rights Reserved.
  4. */
  5. -- - ---------- MSSQL 7.0  ANSIVIEW.SQL 1992 System Views
  6. set nocount on
  7. go
  8. use master        -- THESE NOW EXIST IN MASTER ONLY!
  9. go
  10.  
  11. -- THESE ARE "SYSTEM" OBJECTS --
  12. exec sp_configure 'allow', 1
  13. reconfigure with override
  14. go
  15. exec sp_MS_upd_sysobj_category 1
  16. go
  17.  
  18. -- INFORMATION_SCHEMA login no longer exists...
  19. -- INFORMATION_SCHEMA user is added by hand here:
  20. if user_id('INFORMATION_SCHEMA') is NULL
  21.     INSERT sysusers VALUES (3, 0, 'INFORMATION_SCHEMA', NULL, 0x00, getdate(), getdate(), 0, NULL)
  22. go
  23. -- NO NEED TO GRANT CREATE VIEW TO INFORMATION_SCHEMA
  24.  
  25. if object_id('INFORMATION_SCHEMA.SCHEMATA', 'V') is not NULL
  26.     drop view INFORMATION_SCHEMA.SCHEMATA
  27.  
  28. if object_id('INFORMATION_SCHEMA.TABLES', 'V') is not NULL
  29.     drop view INFORMATION_SCHEMA.TABLES
  30.  
  31. if object_id('INFORMATION_SCHEMA.TABLE_CONSTRAINTS', 'V') is not NULL
  32.     drop view INFORMATION_SCHEMA.TABLE_CONSTRAINTS
  33.  
  34. if object_id('INFORMATION_SCHEMA.TABLE_PRIVILEGES', 'V') is not NULL
  35.     drop view INFORMATION_SCHEMA.TABLE_PRIVILEGES
  36.  
  37. if object_id('INFORMATION_SCHEMA.COLUMNS', 'V') is not NULL
  38.     drop view INFORMATION_SCHEMA.COLUMNS
  39.  
  40. if object_id('INFORMATION_SCHEMA.COLUMN_DOMAIN_USAGE', 'V') is not NULL
  41.     drop view INFORMATION_SCHEMA.COLUMN_DOMAIN_USAGE
  42.  
  43. if object_id('INFORMATION_SCHEMA.COLUMN_PRIVILEGES', 'V') is not NULL
  44.     drop view INFORMATION_SCHEMA.COLUMN_PRIVILEGES
  45.  
  46. if object_id('INFORMATION_SCHEMA.DOMAINS', 'V') is not NULL
  47.     drop view INFORMATION_SCHEMA.DOMAINS
  48.  
  49. if object_id('INFORMATION_SCHEMA.DOMAIN_CONSTRAINTS', 'V') is not NULL
  50.     drop view INFORMATION_SCHEMA.DOMAIN_CONSTRAINTS
  51.  
  52. if object_id('INFORMATION_SCHEMA.KEY_COLUMN_USAGE', 'V') is not NULL
  53.     drop view INFORMATION_SCHEMA.KEY_COLUMN_USAGE
  54.  
  55. if object_id('INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS', 'V') is not NULL
  56.     drop view INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
  57.  
  58. if object_id('INFORMATION_SCHEMA.CHECK_CONSTRAINTS', 'V') is not NULL
  59.     drop view INFORMATION_SCHEMA.CHECK_CONSTRAINTS
  60.  
  61. if object_id('INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE', 'V') is not NULL
  62.     drop view INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE
  63.  
  64. if object_id('INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE', 'V') is not NULL
  65.     drop view INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
  66.  
  67. if object_id('INFORMATION_SCHEMA.VIEWS', 'V') is not NULL
  68.     drop view INFORMATION_SCHEMA.VIEWS
  69.  
  70. if object_id('INFORMATION_SCHEMA.VIEW_TABLE_USAGE', 'V') is not NULL
  71.     drop view INFORMATION_SCHEMA.VIEW_TABLE_USAGE
  72.  
  73. if object_id('INFORMATION_SCHEMA.VIEW_COLUMN_USAGE', 'V') is not NULL
  74.     drop view INFORMATION_SCHEMA.VIEW_COLUMN_USAGE
  75.  
  76. if object_id('INFORMATION_SCHEMA.ROUTINES', 'V') is not NULL
  77.     drop view INFORMATION_SCHEMA.ROUTINES
  78.  
  79. if object_id('INFORMATION_SCHEMA.PARAMETERS', 'V') is not NULL
  80.     drop view INFORMATION_SCHEMA.PARAMETERS
  81.  
  82. if object_id('INFORMATION_SCHEMA.ROUTINE_COLUMNS', 'V') is not NULL
  83.     drop view INFORMATION_SCHEMA.ROUTINE_COLUMNS
  84. go
  85.  
  86.  
  87. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.SCHEMATA')
  88. go
  89.  
  90. --Identifies schmata owned by current users, databases current users has permissions in
  91. create view INFORMATION_SCHEMA.SCHEMATA
  92.  as
  93. select
  94.     db.name                        as CATALOG_NAME
  95.     ,USER_NAME()                as SCHEMA_NAME
  96.     ,USER_NAME()                as SCHEMA_OWNER
  97.     ,convert(sysname, NULL)        as DEFAULT_CHARACTER_SET_CATALOG
  98.     ,convert(sysname, NULL)        as DEFAULT_CHARACTER_SET_SCHEMA
  99.     ,a_cha.name                    as DEFAULT_CHARACTER_SET_NAME
  100. FROM
  101.     master.dbo.sysdatabases         db,
  102.     master.dbo.syscharsets        a_cha --charset/1001, not sortorder.
  103. WHERE
  104.     a_cha.type = 1001 --- type is charset
  105.     AND a_cha.id = convert(tinyint, DatabasePropertyEx(db.name, 'sqlcharset'))
  106. go
  107.  
  108. grant select on INFORMATION_SCHEMA.SCHEMATA to public
  109. go
  110.  
  111. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.TABLES')
  112. go
  113. --Identifies tables accessible to the current user
  114. create view INFORMATION_SCHEMA.TABLES
  115. as 
  116. select  distinct
  117.     db_name()            as TABLE_CATALOG
  118.     ,user_name(o.uid)    as TABLE_SCHEMA
  119.     ,o.name                as TABLE_NAME
  120.     ,case o.xtype
  121.         when 'U' then 'BASE TABLE'
  122.         when 'V' then 'VIEW'
  123.     end                    as TABLE_TYPE
  124. from
  125.     sysobjects o
  126. where
  127.     o.xtype in ('U', 'V') and
  128.     permissions(o.id) != 0
  129. go
  130.  
  131. grant select on INFORMATION_SCHEMA.TABLES to public
  132. go
  133.  
  134. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.TABLE_CONSTRAINTS')
  135. go
  136. --Identifies table constraints for tables where the current user has any permissions on object.
  137. create view INFORMATION_SCHEMA.TABLE_CONSTRAINTS
  138.  as
  139.  select
  140.     db_name()                as CONSTRAINT_CATALOG
  141.     ,user_name(c_obj.uid)    as CONSTRAINT_SCHEMA
  142.     ,c_obj.name                as CONSTRAINT_NAME
  143.     ,db_name()                as TABLE_CATALOG
  144.     ,user_name(t_obj.uid)    as TABLE_SCHEMA
  145.     ,t_obj.name                as TABLE_NAME
  146.     ,case c_obj.xtype
  147.                     when 'C' then    'CHECK'
  148.                     when 'UQ' then    'UNIQUE'
  149.                     when 'PK' then    'PRIMARY KEY'
  150.                     when 'F' then    'FOREIGN KEY'
  151.                    end        as CONSTRAINT_TYPE
  152.     ,'NO'                    as IS_DEFERRABLE
  153.     ,'NO'                    as INITIALLY_DEFERRED
  154. from
  155.     sysobjects    c_obj
  156.     ,sysobjects    t_obj
  157. where
  158.     permissions(t_obj.id) != 0
  159.     and t_obj.id    = c_obj.parent_obj
  160.     and c_obj.xtype    in ('C' ,'UQ' ,'PK' ,'F')
  161. go
  162.  
  163. grant select on INFORMATION_SCHEMA.TABLE_CONSTRAINTS to public
  164. go
  165.  
  166. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.TABLE_PRIVILEGES')
  167. go
  168. --Identifies privileges granted to or by the current user
  169. create view INFORMATION_SCHEMA.TABLE_PRIVILEGES
  170.  as
  171. select    
  172.     user_name(p.grantor)    as GRANTOR
  173.     ,user_name(p.uid)        as GRANTEE
  174.     ,db_name()                as TABLE_CATALOG
  175.     ,user_name(o.uid)        as TABLE_SCHEMA
  176.     ,o.name                    as TABLE_NAME
  177.     ,case p.action        
  178.         when 26  then 'REFERENCES'
  179.         when 193 then 'SELECT'
  180.         when 195 then 'INSERT'
  181.         when 196 then 'DELETE'
  182.         when 197 then 'UPDATE'
  183.     end                        as PRIVILEGE_TYPE
  184.     ,case 
  185.         when p.protecttype = 205 then 'NO'
  186.         else 'YES'
  187.     end                        as IS_GRANTABLE
  188.  from 
  189.     sysprotects p, 
  190.     sysobjects o
  191. where  
  192.     (is_member(user_name(p.uid)) = 1
  193.     or
  194.         p.grantor = user_id())
  195.      and (p.protecttype = 204 or     /*grant exists without same grant with grant */
  196.     (p.protecttype = 205
  197.         and not exists(select * from sysprotects p2
  198.                 where p2.id = p.id and
  199.                 p2.uid = p.uid and 
  200.                 p2.action = p.action and 
  201.                 p2.columns = p.columns and
  202.                 p2.grantor = p.grantor and
  203.                 p2.protecttype = 204)))
  204.      and p.action in (26,193,195,196,197)
  205.      and p.id = o.id
  206.     and o.xtype in ('U', 'V')
  207.      and 0 != (permissions(o.id) &
  208.         case p.action
  209.             when 26  then     4        /*REFERENCES basebit on all columns    */        
  210.             when 193 then     1        /*SELECT basebit on all columns    */        
  211.             when 195 then     8        /*INSERT basebit */
  212.             when 196 then     16        /*DELETE basebit */
  213.             when 197 then     2        /*UPDATE basebit on all columns    */
  214.         end)
  215. go
  216.  
  217. grant select on INFORMATION_SCHEMA.TABLE_PRIVILEGES to public
  218. go
  219.  
  220. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.COLUMNS')
  221. go
  222.  
  223. --Displays columns accessable to the current user
  224. create view INFORMATION_SCHEMA.COLUMNS
  225.  as
  226. select 
  227.     db_name()                        as TABLE_CATALOG
  228.     ,user_name(obj.uid)                as TABLE_SCHEMA
  229.     ,obj.name                        as TABLE_NAME
  230.     ,col.name                        as COLUMN_NAME
  231.     ,col.colid                        as ORDINAL_POSITION
  232.     ,com.text                        as COLUMN_DEFAULT
  233.     ,case col.isnullable 
  234.         when 1 then 'YES'
  235.         else        'No '
  236.     end                                as IS_NULLABLE
  237.     ,spt_dtp.LOCAL_TYPE_NAME        as DATA_TYPE
  238.     ,convert(int, 
  239.        OdbcPrec(col.xtype, col.length, col.xprec) 
  240.        + spt_dtp.charbin)            as CHARACTER_MAXIMUM_LENGTH
  241.     ,convert(int, spt_dtp.charbin + 
  242.        case when spt_dtp.LOCAL_TYPE_NAME in ('nchar', 'nvarchar', 'ntext')
  243.          then  2*OdbcPrec(col.xtype, col.length, col.xprec) 
  244.          else  OdbcPrec(col.xtype, col.length, col.xprec) 
  245.        end)                            as CHARACTER_OCTET_LENGTH
  246.     ,nullif(col.xprec, 0)            as NUMERIC_PRECISION
  247.     ,spt_dtp.RADIX                    as NUMERIC_PRECISION_RADIX
  248.     ,col.scale                        as NUMERIC_SCALE
  249.     ,spt_dtp.SQL_DATETIME_SUB        as DATETIME_PRECISION
  250.     ,convert(sysname, NULL)            as CHARACTER_SET_CATALOG
  251.     ,convert(sysname, NULL)            as CHARACTER_SET_SCHEMA
  252.     ,convert(sysname, case
  253.         when spt_dtp.LOCAL_TYPE_NAME in 
  254.          ('char', 'varchar', 'text')
  255.             then a_cha.name
  256.         when spt_dtp.LOCAL_TYPE_NAME in 
  257.          ('nchar', 'nvarchar', 'ntext')
  258.             then N'Unicode'
  259.         else NULL
  260.     end)                            as CHARACTER_SET_NAME
  261.     ,convert(sysname, NULL)            as COLLATION_CATALOG
  262.     ,convert(sysname, NULL)            as COLLATION_SCHEMA
  263.     ,col.collation                    as COLLATION_NAME
  264.     ,convert(sysname, case when typ.xusertype > 256  
  265.         then DB_NAME()
  266.      else NULL
  267.     end)                                as DOMAIN_CATALOG
  268.     ,convert(sysname, case when typ.xusertype > 256  
  269.             then USER_NAME(obj.uid)
  270.         else NULL
  271.     end)                                as DOMAIN_SCHEMA
  272.     ,convert(sysname, case when typ.xusertype > 256  
  273.             then typ.name
  274.         else NULL
  275.     end)                                as DOMAIN_NAME
  276. FROM
  277.     sysobjects obj,
  278.     master.dbo.spt_datatype_info spt_dtp,
  279.     systypes typ,
  280.     syscolumns col
  281.     LEFT OUTER JOIN syscomments com on col.cdefault = com.id
  282.         AND com.colid = 1,
  283.     master.dbo.syscharsets        a_cha --charset/1001, not sortorder.
  284. WHERE
  285.     permissions(obj.id, col.name) != 0
  286.     AND obj.id = col.id
  287.     AND typ.xtype = spt_dtp.ss_dtype
  288.     AND (spt_dtp.ODBCVer is null or spt_dtp.ODBCVer = 2)
  289.     AND obj.xtype in ('U', 'V')
  290.     AND col.xusertype = typ.xusertype
  291.     AND (spt_dtp.AUTO_INCREMENT is null or spt_dtp.AUTO_INCREMENT = 0)
  292.     AND    a_cha.id = isnull(convert(tinyint, CollationPropertyFromID(col.collationid, 'sqlcharset')),
  293.             convert(tinyint, ServerProperty('sqlcharset'))) -- make sure there's one and only one row selected for each column
  294. go
  295.  
  296. grant select on INFORMATION_SCHEMA.COLUMNS to public
  297. go
  298.  
  299. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.COLUMN_DOMAIN_USAGE')
  300. go
  301.  
  302. --Identifies columns that have a user defined datatype where the
  303. --current user has some permissions on table
  304. create view INFORMATION_SCHEMA.COLUMN_DOMAIN_USAGE
  305.  as
  306. select
  307.     db_name()            as DOMAIN_CATALOG
  308.     ,user_name(typ.uid)    as DOMAIN_SCHEMA
  309.     ,typ.name            as DOMAIN_NAME
  310.     ,db_name()            as TABLE_CATALOG
  311.     ,user_name(obj.uid)    as TABLE_SCHEMA
  312.     ,obj.name            as TABLE_NAME
  313.     ,col.name            as COLUMN_NAME
  314. FROM
  315.     sysobjects obj
  316.     ,syscolumns col
  317.     ,systypes typ 
  318. WHERE
  319.     permissions(obj.id) != 0
  320.     AND obj.id = col.id
  321.     AND col.xusertype = typ.xusertype
  322.     AND typ.xusertype > 256    -- UDF Type
  323.  
  324. go
  325.  
  326. grant select on INFORMATION_SCHEMA.COLUMN_DOMAIN_USAGE to public
  327. go
  328.  
  329. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.COLUMN_PRIVILEGES')
  330. go
  331.  
  332. --Identifies privileges granted to or by current user
  333. create view INFORMATION_SCHEMA.COLUMN_PRIVILEGES
  334.  as
  335. select
  336.     user_name(p.grantor)    as GRANTOR
  337.     ,user_name(p.uid)               as GRANTEE
  338.     ,db_name()                              as TABLE_CATALOG
  339.     ,user_name(o.uid)               as TABLE_SCHEMA
  340.     ,o.name                                 as TABLE_NAME
  341.     ,c.name                                 as COLUMN_NAME
  342.     ,case p.action
  343.             when 193 then 'SELECT'
  344.             when 197 then 'UPDATE'
  345.             else 'REFERENCES'
  346.     end                                             as PRIVILEGE_TYPE
  347.     ,case
  348.             when p.protecttype = 205 then 'NO'
  349.             else 'YES'
  350.     end                                             as IS_GRANTABLE
  351.  from
  352.     sysprotects p,
  353.     sysobjects o,
  354.     syscolumns c
  355. where 
  356.     (is_member(user_name(p.uid)) = 1
  357.     or
  358.             p.grantor = user_id())
  359.     and (p.protecttype = 204 or     /*grant exists without same grant with grant */
  360.     (p.protecttype = 205
  361.             and not exists(select * from sysprotects p2
  362.                             where p2.id = p.id and
  363.                             p2.uid = p.uid and
  364.                             p2.action = p.action and
  365.                             p2.columns = p.columns and
  366.                             p2.grantor = p.grantor and
  367.                             p2.protecttype = 204)))
  368.     and p.action in (26,193,197)
  369.     and p.id = o.id
  370.     and o.xtype in ('U', 'V')
  371.     and o.id = c.id
  372.     and
  373.     (((convert(tinyint,substring(p.columns,1,1))&1) = 0
  374.             and
  375.     (convert(int,substring(p.columns,c.colid/8+1,1))&power(2,c.colid&7)) != 0)
  376.         or
  377.     ((convert(tinyint,substring(p.columns,1,1))&1) != 0
  378.             and 
  379.     (convert(int,substring(p.columns,c.colid/8+1,1))&power(2,c.colid&7)) = 0))
  380.     and 0 != (permissions
  381.             (o.id, c.name) &
  382.             case p.action
  383.                     when 26  then 4         /*REFERENCES basebit    */
  384.                     when 193 then 1         /*SELECT basebit        */
  385.                     when 197 then 2         /*UPDATE basebit        */
  386.                     end)
  387. go
  388.  
  389. grant select on INFORMATION_SCHEMA.COLUMN_PRIVILEGES to public
  390. go
  391.  
  392. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.DOMAINS')
  393. go
  394.  
  395. --Identifies user defined datatype accessible to current user.
  396. create view INFORMATION_SCHEMA.DOMAINS
  397.  as
  398. select
  399.     DB_NAME()                        as DOMAIN_CATALOG
  400.     ,USER_NAME(typ.uid)                as DOMAIN_SCHEMA
  401.     ,typ.name                        as DOMAIN_NAME
  402.     ,spt_dtp.LOCAL_TYPE_NAME        as DATA_TYPE
  403.     ,convert(int, 
  404.        OdbcPrec(typ.xtype, typ.length, typ.xprec) 
  405.        + spt_dtp.charbin)            as CHARACTER_MAXIMUM_LENGTH
  406.     ,convert(int, spt_dtp.charbin + 
  407.        case when spt_dtp.LOCAL_TYPE_NAME in ('nchar', 'nvarchar', 'ntext')
  408.          then  2*OdbcPrec(typ.xtype, typ.length, typ.xprec) 
  409.          else  OdbcPrec(typ.xtype, typ.length, typ.xprec) 
  410.        end)                            as CHARACTER_OCTET_LENGTH
  411.     ,convert(sysname, NULL)            as COLLATION_CATALOG
  412.     ,convert(sysname, NULL)            as COLLATION_SCHEMA
  413.     ,typ.collation                    as COLLATION_NAME
  414.     ,convert(sysname, NULL)            as CHARACTER_SET_CATALOG
  415.     ,convert(sysname, NULL)            as CHARACTER_SET_SCHEMA
  416.     ,convert(sysname, case
  417.         when spt_dtp.LOCAL_TYPE_NAME in 
  418.          ('char', 'varchar', 'text')
  419.             then a_cha.name
  420.         when spt_dtp.LOCAL_TYPE_NAME in 
  421.          ('nchar', 'nvarchar', 'ntext')
  422.             then N'Unicode'
  423.         else NULL
  424.     end)                            as CHARACTER_SET_NAME
  425.     ,nullif(typ.xprec, 0)            as NUMERIC_PRECISION
  426.     ,spt_dtp.RADIX                    as NUMERIC_PRECISION_RADIX
  427.     ,convert(int, typ.scale)        as NUMERIC_SCALE
  428.     ,spt_dtp.SQL_DATETIME_SUB        as DATETIME_PRECISION
  429.     ,com.text                        as DOMAIN_DEFAULT
  430. FROM
  431.     master.dbo.spt_datatype_info spt_dtp,
  432.     systypes typ LEFT OUTER JOIN syscomments com
  433.          on typ.tdefault = com.id AND com.colid = 1,
  434.     master.dbo.syscharsets        a_cha --charset/1001, not sortorder.
  435. WHERE
  436.      typ.xtype = spt_dtp.ss_dtype
  437.     AND (spt_dtp.ODBCVer is null or spt_dtp.ODBCVer = 2)    -- Use 7.0 entries
  438.     AND (spt_dtp.AUTO_INCREMENT is null or spt_dtp.AUTO_INCREMENT = 0)    -- Remove auto increment types
  439.     AND a_cha.type = 1001                     --- type is charset
  440.     AND a_cha.id = convert(tinyint, ServerProperty('sqlcharset'))
  441.     AND typ.xusertype > 256                    -- UDF Type
  442. go
  443.  
  444. grant select on INFORMATION_SCHEMA.DOMAINS to public
  445. go
  446.  
  447. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.DOMAIN_CONSTRAINTS')
  448. go
  449.  
  450. --Identifies user defined datatype accessible to current user, that have constraints
  451. create view INFORMATION_SCHEMA.DOMAIN_CONSTRAINTS
  452.  as
  453. select
  454.     DB_NAME()            as CONSTRAINT_CATALOG
  455.     ,USER_NAME(obj.uid)    as CONSTRAINT_SCHEMA
  456.     ,obj.name            as CONSTRAINT_NAME
  457.     ,DB_NAME()            as DOMAIN_CATALOG
  458.     ,USER_NAME(typ.uid)    as DOMAIN_SCHEMA
  459.     ,typ.name            as DOMAIN_NAME
  460.     ,'NO'                as IS_DEFERRABLE
  461.     ,'NO'                as INITIALLY_DEFERRED
  462. FROM
  463.     sysobjects obj,
  464.     systypes typ 
  465. WHERE
  466.     obj.xtype = 'R'
  467.     and obj.id = typ.domain
  468.     AND typ.xusertype > 256    -- UDF Type
  469. go
  470.  
  471. grant select on INFORMATION_SCHEMA.DOMAIN_CONSTRAINTS to public
  472. go
  473.  
  474. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.KEY_COLUMN_USAGE')
  475. go
  476.  
  477. --Identifies columns which have constrained keys where the current user
  478. --has any permissions on that table.
  479. create view INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
  480.  as
  481.  select
  482.     db_name()                as CONSTRAINT_CATALOG
  483.     ,user_name(c_obj.uid)    as CONSTRAINT_SCHEMA
  484.     ,c_obj.name                as CONSTRAINT_NAME
  485.     ,db_name()                as TABLE_CATALOG
  486.     ,user_name(t_obj.uid)    as TABLE_SCHEMA
  487.     ,t_obj.name                as TABLE_NAME
  488.     ,col.name                as COLUMN_NAME
  489.     ,case col.colid    
  490.         when ref.fkey1 then 1            
  491.         when ref.fkey2 then 2            
  492.         when ref.fkey3 then 3            
  493.         when ref.fkey4 then 4            
  494.         when ref.fkey5 then 5            
  495.         when ref.fkey6 then 6            
  496.         when ref.fkey7 then 7            
  497.         when ref.fkey8 then 8            
  498.         when ref.fkey9 then 9            
  499.         when ref.fkey10 then 10            
  500.         when ref.fkey11 then 11            
  501.         when ref.fkey12 then 12            
  502.         when ref.fkey13 then 13            
  503.         when ref.fkey14 then 14            
  504.         when ref.fkey15 then 15            
  505.         when ref.fkey16 then 16
  506.     end                        as ORDINAL_POSITION
  507. from
  508.     sysobjects    c_obj
  509.     ,sysobjects    t_obj
  510.     ,syscolumns    col
  511.     ,sysreferences  ref
  512. where
  513.     permissions(t_obj.id) != 0
  514.     and c_obj.xtype    in ('F ')
  515.     and t_obj.id    = c_obj.parent_obj
  516.     and t_obj.id    = col.id
  517.     and col.colid   in 
  518.     (ref.fkey1,ref.fkey2,ref.fkey3,ref.fkey4,ref.fkey5,ref.fkey6,
  519.     ref.fkey7,ref.fkey8,ref.fkey9,ref.fkey10,ref.fkey11,ref.fkey12,
  520.     ref.fkey13,ref.fkey14,ref.fkey15,ref.fkey16)
  521.     and c_obj.id    = ref.constid
  522. union
  523.  select
  524.     db_name()                as CONSTRAINT_CATALOG
  525.     ,user_name(c_obj.uid)    as CONSTRAINT_SCHEMA
  526.     ,i.name                    as CONSTRAINT_NAME
  527.     ,db_name()                as TABLE_CATALOG
  528.     ,user_name(t_obj.uid)    as TABLE_SCHEMA
  529.     ,t_obj.name                as TABLE_NAME
  530.     ,col.name                as COLUMN_NAME
  531.     ,v.number                as ORDINAL_POSITION
  532. from
  533.     sysobjects        c_obj
  534.     ,sysobjects        t_obj
  535.     ,syscolumns        col
  536.     ,master.dbo.spt_values     v
  537.     ,sysindexes        i
  538. where
  539.     permissions(t_obj.id) != 0
  540.     and c_obj.xtype    in ('UQ' ,'PK')
  541.     and t_obj.id    = c_obj.parent_obj
  542.     and t_obj.xtype  = 'U'
  543.     and t_obj.id    = col.id
  544.     and col.name    = index_col(t_obj.name,i.indid,v.number)
  545.     and t_obj.id    = i.id
  546.     and c_obj.name  = i.name
  547.     and v.number     > 0 
  548.      and v.number     <= i.keycnt 
  549.      and v.type     = 'P'
  550. go
  551.  
  552. grant select on INFORMATION_SCHEMA.KEY_COLUMN_USAGE to public
  553. go
  554.  
  555. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS')
  556. go
  557.  
  558. --Identifies foreign constraints where the current user has
  559. --any permissions on the object
  560. create view INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
  561.  as
  562.  select
  563.     db_name()                as CONSTRAINT_CATALOG
  564.     ,user_name(fc_obj.uid)    as CONSTRAINT_SCHEMA
  565.     ,fc_obj.name            as CONSTRAINT_NAME
  566.     ,db_name()                as UNIQUE_CONSTRAINT_CATALOG
  567.     ,user_name(pc_obj.uid)    as UNIQUE_CONSTRAINT_SCHEMA
  568.     ,i.name                    as UNIQUE_CONSTRAINT_NAME
  569.     ,'NONE'                    as MATCH_OPTION
  570.     ,CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN 
  571.         'CASCADE' ELSE 'NO ACTION' END as UPDATE_RULE
  572.     ,CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN 
  573.         'CASCADE' ELSE 'NO ACTION' END as DELETE_RULE
  574. from    
  575.     sysobjects    fc_obj
  576.     ,sysreferences    r
  577.     ,sysindexes    i
  578.     ,sysobjects    pc_obj
  579. where 
  580.     permissions(fc_obj.parent_obj) != 0
  581.     and fc_obj.xtype    = 'F'
  582.     and r.constid        = fc_obj.id
  583.     and r.rkeyid        = i.id
  584.     and r.rkeyindid     = i.indid
  585.     and r.rkeyid        = pc_obj.id
  586. go
  587.  
  588. grant select on INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS to public
  589. go
  590.  
  591. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.CHECK_CONSTRAINTS')
  592. go
  593.  
  594. --Identifies check constraints where the current user has any
  595. --permissions on the table object 
  596. create view INFORMATION_SCHEMA.CHECK_CONSTRAINTS
  597. as
  598. select
  599.     db_name()                as CONSTRAINT_CATALOG
  600.     ,user_name(c_obj.uid)    as CONSTRAINT_SCHEMA
  601.     ,c_obj.name                as CONSTRAINT_NAME
  602.     ,com.text                as CHECK_CLAUSE
  603. from
  604.     sysobjects    c_obj
  605.     ,syscomments    com
  606. where
  607.     permissions(c_obj.parent_obj) != 0
  608.     and c_obj.id    = com.id
  609.     and c_obj.xtype    = 'C'
  610. go
  611.  
  612. grant select on INFORMATION_SCHEMA.CHECK_CONSTRAINTS to public
  613. go
  614.  
  615. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE')
  616. go
  617.  
  618. --Identifies tables that have constraints where the
  619. --current user has any permissions on the table
  620. create view INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE
  621.  as
  622.  select
  623.     db_name()                as TABLE_CATALOG
  624.     ,user_name(t_obj.uid)    as TABLE_SCHEMA
  625.     ,t_obj.name                as TABLE_NAME
  626.     ,db_name()                as CONSTRAINT_CATALOG
  627.     ,user_name(c_obj.uid)    as CONSTRAINT_SCHEMA
  628.     ,c_obj.name                as CONSTRAINT_NAME
  629. from
  630.     sysobjects    c_obj
  631.     ,sysobjects    t_obj
  632. where
  633.     permissions(t_obj.id) != 0
  634.     and t_obj.id    = c_obj.parent_obj
  635.     and c_obj.xtype    in ('C' ,'UQ' ,'PK' ,'F')
  636. go
  637.  
  638. grant select on INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE to public
  639. go
  640.  
  641. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE')
  642. go
  643.  
  644. --Identifies tables and columns that have constraints and the current
  645. --user has any permissions on the column
  646. create view INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
  647. (
  648. TABLE_CATALOG
  649. ,TABLE_SCHEMA
  650. ,TABLE_NAME
  651. ,COLUMN_NAME
  652. ,CONSTRAINT_CATALOG
  653. ,CONSTRAINT_SCHEMA
  654. ,CONSTRAINT_NAME
  655. )
  656.  as
  657.  select
  658.     KCU.TABLE_CATALOG    /*TABLE_CATALOG*/
  659.     ,KCU.TABLE_SCHEMA     /*TABLE_SCHEMA*/
  660.     ,KCU.TABLE_NAME     /*TABLE_NAME*/
  661.     ,KCU.COLUMN_NAME     /*COLUMN_NAME*/
  662.     ,KCU.CONSTRAINT_CATALOG/*CONSTRAINT_CATALOG*/
  663.     ,KCU.CONSTRAINT_SCHEMA /*CONSTRAINT_SCHEMA*/
  664.     ,KCU.CONSTRAINT_NAME     /*CONSTRAINT_NAME*/
  665. from    
  666.     INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
  667. UNION
  668.  select
  669.     db_name()            /*TABLE_CATALOG*/
  670.     ,user_name(t_obj.uid)/*TABLE_SCHEMA*/
  671.     ,t_obj.name            /*TABLE_NAME*/
  672.     ,cols.name            /*COLUMN_NAME*/
  673.     ,db_name()            /*CONSTRAINT_CATALOG*/
  674.     ,user_name(c_obj.uid)/*CONSTRAINT_SCHEMA*/
  675.     ,c_obj.name            /*CONSTRAINT_NAME*/
  676. from    
  677.     sysobjects    t_obj
  678.     ,sysobjects    c_obj
  679.     ,syscolumns cols    
  680. where
  681.     permissions(t_obj.id) != 0
  682.     and t_obj.id    = c_obj.parent_obj
  683.     and c_obj.xtype    = 'C'
  684.     and c_obj.info    = cols.colid
  685.     and cols.id        = c_obj.parent_obj
  686. UNION
  687. select
  688.     db_name()        /*TABLE_CATALOG*/
  689.     ,user_name(t_obj.uid)    /*TABLE_SCHEMA*/
  690.     ,t_obj.name        /*TABLE_NAME*/
  691.     ,col.name        /*COLUMN_NAME*/
  692.     ,db_name()        /*CONSTRAINT_CATALOG*/
  693.     ,user_name(r_obj.uid)    /*CONSTRAINT_SCHEMA*/
  694.     ,r_obj.name        /*CONSTRAINT_NAME*/
  695. FROM
  696.     sysobjects t_obj
  697.     ,syscolumns col
  698.     ,systypes typ 
  699.     ,sysobjects  r_obj
  700. WHERE
  701.     permissions(t_obj.id) != 0
  702.     AND t_obj.id = col.id
  703.     AND col.xusertype = typ.xusertype
  704.     AND typ.xusertype > 256    -- UDF Type
  705.     AND typ.domain = r_obj.id
  706.     AND r_obj.xtype = 'R'
  707. go
  708.  
  709. grant select on INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE to public
  710. go
  711.  
  712. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.VIEWS')
  713. go
  714.  
  715. -- Displays views accessable to current user
  716. create view INFORMATION_SCHEMA.VIEWS
  717.  as
  718.  select
  719.     db_name()                as TABLE_CATALOG
  720.     ,user_name(obj.uid)        as TABLE_SCHEMA
  721.     ,obj.name                as TABLE_NAME
  722.     ,case
  723.         when exists (select * 
  724.             from syscomments com3
  725.             where com3.id = obj.id
  726.             and com3.colid > 1)    then convert(nvarchar(4000), NULL)
  727.         else com.text
  728.     end                        as VIEW_DEFINITION
  729.     ,case
  730.         when exists (select *
  731.             from syscomments com2
  732.             where com2.id = obj.id 
  733.             and CHARINDEX('WITH CHECK OPTION',             
  734.             upper(com2.text)) > 0)  then 'CASCADE'
  735.         else 'NONE'
  736.     end                        as CHECK_OPTION
  737.     ,'NO'                    as IS_UPDATABLE
  738. from
  739.     sysobjects obj
  740.     ,syscomments com
  741. where   
  742.     permissions(obj.id) != 0
  743.     and obj.xtype    = 'V'
  744.     and obj.id      = com.id
  745.     and com.colid    = 1
  746. go
  747.  
  748. grant select on INFORMATION_SCHEMA.VIEWS to public
  749. go
  750.  
  751. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.VIEW_TABLE_USAGE')
  752. go
  753.  
  754. -- Identifies views and the tables used in their definition which are
  755. -- owned where the current user has any permissions on the view    
  756. create view INFORMATION_SCHEMA.VIEW_TABLE_USAGE
  757.  as
  758. select distinct
  759.     db_name()                as VIEW_CATALOG
  760.     ,user_name(v_obj.uid)    as VIEW_SCHEMA 
  761.     ,v_obj.name                as VIEW_NAME
  762.     ,db_name()                as TABLE_CATALOG
  763.     ,user_name(t_obj.uid)    as TABLE_SCHEMA
  764.     ,t_obj.name                as TABLE_NAME
  765. from
  766.      sysobjects    t_obj
  767.     ,sysobjects    v_obj
  768.     ,sysdepends    dep    
  769. where
  770.     permissions(v_obj.id) != 0
  771.     and v_obj.xtype    = 'V'
  772.     and dep.id     = v_obj.id
  773.     and dep.depid    = t_obj.id
  774.  
  775. go
  776.  
  777. grant select on INFORMATION_SCHEMA.VIEW_TABLE_USAGE to public
  778. go
  779.  
  780. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.VIEW_COLUMN_USAGE')
  781. go
  782.  
  783. -- Identifies views and the columns used in their definition where the
  784. --current user has any permissions on the view
  785. create view INFORMATION_SCHEMA.VIEW_COLUMN_USAGE
  786.  as
  787. select
  788.     db_name()                as VIEW_CATALOG
  789.     ,user_name(v_obj.uid)    as VIEW_SCHEMA
  790.     ,v_obj.name                as VIEW_NAME
  791.     ,db_name()                as TABLE_CATALOG
  792.     ,user_name(t_obj.uid)    as TABLE_SCHEMA
  793.     ,t_obj.name                as TABLE_NAME
  794.     ,col.name                as COLUMN_NAME 
  795. from
  796.      sysobjects    t_obj
  797.     ,sysobjects    v_obj
  798.     ,sysdepends    dep
  799.     ,syscolumns col
  800.             
  801. where
  802.     permissions(v_obj.id) != 0
  803.     and v_obj.xtype    = 'V'
  804.     and dep.id    = v_obj.id
  805.     and dep.depid    = t_obj.id
  806.     and t_obj.id    = col.id
  807.     and dep.depnumber    = col.colid
  808. go
  809.  
  810. grant select on INFORMATION_SCHEMA.VIEW_COLUMN_USAGE to public
  811. go
  812.  
  813. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.ROUTINES')
  814. go
  815.  
  816. create view INFORMATION_SCHEMA.ROUTINES
  817.     as
  818. SELECT
  819.     SPECIFIC_CATALOG            = db_name(),
  820.     SPECIFIC_SCHEMA                = user_name(o.uid),
  821.     SPECIFIC_NAME                = o.name,
  822.     ROUTINE_CATALOG                = db_name(),
  823.     ROUTINE_SCHEMA                = user_name(o.uid),
  824.     ROUTINE_NAME                = o.name,
  825.     ROUTINE_TYPE                = convert(nvarchar(20), CASE
  826.                                     WHEN o.xtype='P' THEN 'PROCEDURE'
  827.                                     ELSE 'FUNCTION' END),
  828.     MODULE_CATALOG                = convert(sysname,null),
  829.     MODULE_SCHEMA                = convert(sysname,null),
  830.     MODULE_NAME                    = convert(sysname,null),
  831.     UDT_CATALOG                    = convert(sysname,null),
  832.     UDT_SCHEMA                    = convert(sysname,null),
  833.     UDT_NAME                    = convert(sysname,null),
  834.     DATA_TYPE                    = case when o.xtype IN ('TF', 'IF') then N'TABLE' else spt_dtp.LOCAL_TYPE_NAME end,
  835.     CHARACTER_MAXIMUM_LENGTH    = convert(int, OdbcPrec(c.xtype, c.length, c.xprec) + spt_dtp.charbin),
  836.     CHARACTER_OCTET_LENGTH        = convert(int, spt_dtp.charbin + 
  837.                                                case when spt_dtp.LOCAL_TYPE_NAME in ('nchar', 'nvarchar', 'ntext')
  838.                                                   then  2*OdbcPrec(c.xtype, c.length, c.xprec) 
  839.                                                   else  OdbcPrec(c.xtype, c.length, c.xprec) 
  840.                                                end),
  841.     COLLATION_CATALOG            = convert(sysname, null),
  842.     COLLATION_SCHEMA            = convert(sysname, null),
  843.     COLLATION_NAME                = c.collation,
  844.     CHARACTER_SET_CATALOG        = convert(sysname, null),
  845.     CHARACTER_SET_SCHEMA        = convert(sysname, null),
  846.     CHARACTER_SET_NAME            = convert(sysname, case 
  847.                                     when spt_dtp.LOCAL_TYPE_NAME in ('char', 'varchar', 'text')
  848.                                         then a_cha.name
  849.                                     when spt_dtp.LOCAL_TYPE_NAME in ('nchar', 'nvarchar', 'ntext')
  850.                                         then N'Unicode'
  851.                                     else NULL 
  852.                                   end),    
  853.     NUMERIC_PRECISION            = c.xprec,
  854.     NUMERIC_PRECISION_RADIX        = spt_dtp.RADIX,
  855.     NUMERIC_SCALE                = c.scale,
  856.     DATETIME_PRECISION            = spt_dtp.SQL_DATETIME_SUB,
  857.     INTERVAL_TYPE                = convert(nvarchar(30),null),
  858.     INTERVAL_PRECISION            = convert(smallint,null),
  859.     TYPE_UDT_CATALOG            = convert(sysname,null),
  860.     TYPE_UDT_SCHEMA                = convert(sysname,null),
  861.     TYPE_UDT_NAME                 = convert(sysname,null),
  862.     SCOPE_CATALOG                 = convert(sysname,null),
  863.     SCOPE_SCHEMA                 = convert(sysname,null),
  864.     SCOPE_NAME                    = convert(sysname,null),
  865.     MAXIMUM_CARDINALITY            = convert(bigint,null),
  866.     DTD_IDENTIFIER                = convert(sysname,null),
  867.     ROUTINE_BODY                = convert(nvarchar(30), 'SQL'),
  868.     ROUTINE_DEFINITION            = convert(nvarchar(4000),
  869.             (SELECT TOP 1 CASE WHEN encrypted = 1 THEN NULL ELSE com.text END
  870.                 FROM syscomments com WHERE com.id=o.id AND com.number<=1 AND com.colid = 1)),
  871.     EXTERNAL_NAME                = convert(sysname,null),
  872.     EXTERNAL_LANGUAGE            = convert(nvarchar(30),null),
  873.     PARAMETER_STYLE                = convert(nvarchar(30),null),
  874.     IS_DETERMINISTIC            = convert(nvarchar(10),
  875.                                     CASE WHEN ObjectProperty(o.id, 'IsDeterministic')=1
  876.                                     THEN 'YES' ELSE 'NO' END),
  877.     SQL_DATA_ACCESS                = convert(nvarchar(30), CASE
  878.                                     WHEN o.xtype='P' THEN 'MODIFIES'
  879.                                     ELSE 'READS' END),
  880.     IS_NULL_CALL                = convert(nvarchar(10),null),
  881.     SQL_PATH                    = convert(sysname,null),
  882.     SCHEMA_LEVEL_ROUTINE        = convert(nvarchar(10),'YES'),
  883.     MAX_DYNAMIC_RESULT_SETS        = convert(smallint, CASE
  884.                                     WHEN o.xtype='P' THEN -1 ELSE 0 END),
  885.     IS_USER_DEFINED_CAST        = convert(nvarchar(10),'NO'),
  886.     IS_IMPLICITLY_INVOCABLE        = convert(nvarchar(10),'NO'),
  887.     CREATED                        = o.crdate,
  888.     LAST_ALTERED                = o.crdate
  889. FROM
  890.     sysobjects o LEFT OUTER JOIN 
  891.         (syscolumns c JOIN master.dbo.spt_datatype_info spt_dtp
  892.         ON c.xtype = spt_dtp.ss_dtype
  893.             AND (spt_dtp.ODBCVer is null or spt_dtp.ODBCVer = 2)
  894.             AND (spt_dtp.AUTO_INCREMENT is null or spt_dtp.AUTO_INCREMENT = 0)
  895.         )
  896.     ON (o.id = c.id AND c.number = 0 AND c.colid = 0),
  897.     master.dbo.syscharsets        a_cha --charset/1001, not sortorder.
  898. where
  899.     o.xtype IN ('P','FN','TF', 'IF')
  900.     AND permissions(o.id) != 0
  901.     AND    a_cha.id = isnull(convert(tinyint, CollationProperty(c.collation, 'sqlcharset')),
  902.             convert(tinyint, ServerProperty('sqlcharset'))) -- make sure there's one and only one row selected for each column
  903. go
  904.  
  905. grant select on INFORMATION_SCHEMA.ROUTINES to public
  906. go
  907.  
  908. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.PARAMETERS')
  909. go
  910.  
  911. create view INFORMATION_SCHEMA.PARAMETERS
  912.     as
  913. SELECT
  914.     SPECIFIC_CATALOG            = db_name(),
  915.     SPECIFIC_SCHEMA                = user_name(o.uid),
  916.     SPECIFIC_NAME                = o.name,
  917.     ORDINAL_POSITION            = c.colid,
  918.     PARAMETER_MODE                = convert(nvarchar(10), CASE
  919.                                     WHEN c.colid=0 THEN 'OUT'
  920.                                     WHEN ColumnProperty(c.id, c.name, 'IsOutParam')=1 THEN 'INOUT'
  921.                                     ELSE 'IN' END),
  922.     IS_RESULT                    = convert(nvarchar(10), CASE
  923.                                     WHEN c.colid=0 THEN 'YES' ELSE 'NO' END),
  924.     AS_LOCATOR                    = convert(nvarchar(10),'NO'),
  925.     PARAMETER_NAME                = c.name,
  926.     DATA_TYPE                    = spt_dtp.LOCAL_TYPE_NAME,
  927.     CHARACTER_MAXIMUM_LENGTH    = convert(int, OdbcPrec(c.xtype, c.length, c.xprec) + spt_dtp.charbin),
  928.     CHARACTER_OCTET_LENGTH        = convert(int, spt_dtp.charbin + 
  929.                                                case when spt_dtp.LOCAL_TYPE_NAME in ('nchar', 'nvarchar', 'ntext')
  930.                                                   then  2*OdbcPrec(c.xtype, c.length, c.xprec) 
  931.                                                   else  OdbcPrec(c.xtype, c.length, c.xprec) 
  932.                                                end),
  933.     COLLATION_CATALOG            = convert(sysname,null),
  934.     COLLATION_SCHEMA            = convert(sysname,null),
  935.     COLLATION_NAME                = c.collation,
  936.     CHARACTER_SET_CATALOG        = convert( sysname, null),
  937.     CHARACTER_SET_SCHEMA        = convert( sysname, null),
  938.     CHARACTER_SET_NAME            = convert( sysname, case 
  939.                                     when spt_dtp.LOCAL_TYPE_NAME in ('char', 'varchar', 'text')
  940.                                         then a_cha.name
  941.                                     when spt_dtp.LOCAL_TYPE_NAME in ('nchar', 'nvarchar', 'ntext')
  942.                                         then N'Unicode'
  943.                                     else NULL 
  944.                                   end),    
  945.     NUMERIC_PRECISION            = c.xprec,
  946.     NUMERIC_PRECISION_RADIX        = spt_dtp.RADIX,
  947.     NUMERIC_SCALE                = c.scale,
  948.     DATETIME_PRECISION            = spt_dtp.SQL_DATETIME_SUB,
  949.     INTERVAL_TYPE                = convert(nvarchar(30),null),
  950.     INTERVAL_PRECISION            = convert(smallint,null),
  951.     USER_DEFINED_TYPE_CATALOG    = convert(sysname,null),
  952.     USER_DEFINED_TYPE_SCHEMA    = convert(sysname,null),
  953.     USER_DEFINED_TYPE_NAME        = convert(sysname,null),
  954.     SCOPE_CATALOG                 = convert(sysname,null),
  955.     SCOPE_SCHEMA                 = convert(sysname,null),
  956.     SCOPE_NAME                    = convert(sysname,null)
  957. FROM
  958.     sysobjects o,
  959.     syscolumns c JOIN master.dbo.spt_datatype_info spt_dtp
  960.         ON c.xtype = spt_dtp.ss_dtype
  961.             AND (spt_dtp.ODBCVer is null or spt_dtp.ODBCVer = 2)
  962.             AND (spt_dtp.AUTO_INCREMENT is null or spt_dtp.AUTO_INCREMENT = 0),
  963.     master.dbo.syscharsets        a_cha --charset/1001, not sortorder.
  964. where
  965.     o.xtype IN ('P','FN','TF', 'IF')
  966.     AND o.id = c.id AND (c.number = 1 OR (c.number = 0 AND o.xtype = 'FN'))
  967.     AND permissions(o.id) != 0
  968.     AND    a_cha.id = isnull(convert(tinyint, CollationProperty(c.collation, 'sqlcharset')),
  969.             convert(tinyint, ServerProperty('sqlcharset'))) -- make sure there's one and only one row selected for each column
  970. go
  971.  
  972. grant select on INFORMATION_SCHEMA.PARAMETERS to public
  973. go
  974.  
  975. raiserror(15339,-1,-1,'INFORMATION_SCHEMA.ROUTINE_COLUMNS')
  976. go
  977.  
  978. create view INFORMATION_SCHEMA.ROUTINE_COLUMNS
  979.     as
  980. SELECT
  981.     TABLE_CATALOG                = db_name(),
  982.     TABLE_SCHEMA                = user_name(o.uid),
  983.     TABLE_NAME                    = o.name,
  984.     COLUMN_NAME                    = c.name,
  985.     ORDINAL_POSITION            = c.colid,
  986.     COLUMN_DEFAULT                = convert(nvarchar(4000),null),
  987.     IS_NULLABLE                    = convert(varchar(3), CASE WHEN c.isnullable=1
  988.                                     THEN 'YES' ELSE 'NO' END),
  989.     DATA_TYPE                    = spt_dtp.LOCAL_TYPE_NAME,
  990.     CHARACTER_MAXIMUM_LENGTH    = convert(int, OdbcPrec(c.xtype, c.length, c.xprec) + spt_dtp.charbin),
  991.     CHARACTER_OCTET_LENGTH        = convert(int, spt_dtp.charbin + 
  992.                                                case when spt_dtp.LOCAL_TYPE_NAME in ('nchar', 'nvarchar', 'ntext')
  993.                                                   then  2*OdbcPrec(c.xtype, c.length, c.xprec) 
  994.                                                   else  OdbcPrec(c.xtype, c.length, c.xprec) 
  995.                                                end),
  996.     NUMERIC_PRECISION            = c.xprec,
  997.     NUMERIC_PRECISION_RADIX        = spt_dtp.RADIX,
  998.     NUMERIC_SCALE                = c.scale,
  999.     DATETIME_PRECISION            = spt_dtp.SQL_DATETIME_SUB,
  1000.     CHARACTER_SET_CATALOG        = convert( sysname, null),
  1001.     CHARACTER_SET_SCHEMA        = convert( sysname, null),
  1002.     CHARACTER_SET_NAME            = convert( sysname, case 
  1003.                                     when spt_dtp.LOCAL_TYPE_NAME in ('char', 'varchar', 'text')
  1004.                                         then a_cha.name
  1005.                                     when spt_dtp.LOCAL_TYPE_NAME in ('nchar', 'nvarchar', 'ntext')
  1006.                                         then N'Unicode'
  1007.                                     else NULL 
  1008.                                   end),    
  1009.     COLLATION_CATALOG            = convert(sysname, null),
  1010.     COLLATION_SCHEMA            = convert(sysname, null),
  1011.     COLLATION_NAME                = c.collation,
  1012.     DOMAIN_CATALOG                = convert(sysname,CASE WHEN c.xusertype > 256
  1013.                                     THEN db_name() ELSE null END),
  1014.     DOMAIN_SCHEMA                = convert(sysname,CASE WHEN c.xusertype > 256
  1015.                                     THEN user_name(o.uid) ELSE null END),
  1016.     DOMAIN_NAME                    = convert(sysname,CASE WHEN c.xusertype > 256
  1017.                                     THEN type_name(xusertype) ELSE null END)
  1018.  
  1019. FROM
  1020.     sysobjects o,
  1021.     syscolumns c JOIN master.dbo.spt_datatype_info spt_dtp
  1022.         ON c.xtype = spt_dtp.ss_dtype
  1023.             AND (spt_dtp.ODBCVer is null or spt_dtp.ODBCVer = 2)
  1024.             AND (spt_dtp.AUTO_INCREMENT is null or spt_dtp.AUTO_INCREMENT = 0),
  1025.     master.dbo.syscharsets        a_cha --charset/1001, not sortorder.
  1026. where
  1027.     o.xtype IN ('TF','IF')
  1028.     AND o.id = c.id AND c.number = 0
  1029.     AND permissions(o.id) != 0
  1030.     AND    a_cha.id = isnull(convert(tinyint, CollationProperty(c.collation, 'sqlcharset')),
  1031.             convert(tinyint, ServerProperty('sqlcharset'))) -- make sure there's one and only one row selected for each column
  1032. go
  1033.  
  1034. grant select on INFORMATION_SCHEMA.ROUTINE_COLUMNS to public
  1035. go
  1036.  
  1037.  
  1038.  
  1039. -- END OF "SYSTEM" OBJECT CREATION --
  1040. exec sp_MS_upd_sysobj_category 2
  1041. go
  1042. exec sp_configure 'allow', 0
  1043. reconfigure with override
  1044. go
  1045.